﻿using System;
using System.Collections.Generic;
using System.Linq;
using Web.Extensions;
using Web.Helpers;
using System.Web.Services;
using Controladores;
using Entidades;
using Entidades.jSON;
using Newtonsoft.Json;
using Common;

namespace Web.Pages
{
    public partial class Configuracion : BasePage
    {
        internal enum Locations
        {
            Row = 1,
            Col = 2
        }

        private char DecimalSeparator = Convert.ToChar(System.Globalization.NumberFormatInfo.CurrentInfo.PercentDecimalSeparator);

        #region Events

        protected new void Page_Load(object sender, EventArgs e)
        {
            base.Page_Load(sender, e);

            if (!Page.IsPostBack)
            {
                this.CargarPagina();
            }
        }

        #endregion

        #region Private Methods

        private void CargarPagina()
        {
            var parametros = new ControladorBase<Parametro>().ObtenerEntidad();
            if ( parametros.IsNotNull() )
            {
                #region Datos
                txtDatos_RazonSocial.Value              = parametros.RazonSocial;
                txtDatos_NroCuit.Value                  = parametros.NroCuit;
                txtDatos_IngresosBrutos.Value           = parametros.IngresosBrutos;
                txtDatos_DomicilioLegal.Value           = parametros.DomicilioLegal;
                txtDatos_DomicilioReal.Value            = parametros.DomicilioReal;
                txtDatos_Telefono.Value                 = parametros.Telefono;
                txtDatos_Fax.Value                      = parametros.Fax;
                txtDatos_Email.Value                    = parametros.EmailEmpresa;
                txtDatos_Responsable.Value              = parametros.Responsable;
                txtDatos_Contacto.Value                 = parametros.Contacto;
                txtDatos_TelefonoContacto.Value         = parametros.TelefonoContacto;
                txtDatos_CelularContacto.Value          = parametros.CelularContacto;
                txtDatos_EmailContacto.Value            = parametros.EmailContacto;
                #endregion

                #region Email
                txtEmail_Sistema_Nombre.Value           = parametros.EmailNombre;
                txtEmail_Sistema_NombreUsuario.Value    = parametros.EmailNombreUsuario;
                txtEmail_Sistema_Password.Value         = parametros.EmailPassword;
                txtEmail_Sistema_SMTP.Value             = parametros.EmailSMTP;
                txtEmail_Sistema_Puerto.Value           = parametros.EmailPuerto.ToString();
                chkEmail_Sistema_HabilitarSSL.Checked   = parametros.EmailHabilitarSSL;
                txtEmail_Casillas_Directores.Value      = parametros.EmailDirectores;
                txtEmail_Casillas_Proveedores.Value     = parametros.EmailProveedores;
                txtEmail_Casillas_Reclamos.Value        = parametros.EmailReclamos;
                #endregion
            }
            
            #region Costos
            var costos              = new ControladorBase<Costo>().ObtenerEntidades();
            var costoSeries         = costos.FirstOrDefault(x => x.TipoProyecto.Id == WellKnownKeys.Entities.TiposProyecto.SERIE.Id);
            var costoVideojuegos    = costos.FirstOrDefault(x => x.TipoProyecto.Id == WellKnownKeys.Entities.TiposProyecto.VIDEOJUEGO.Id);

            if  ( costoSeries.IsNotNull() )
            {
                txtCostos_Series_Loops.Value                = Common.Formatter.ToFixed(costoSeries.Loops);
                txtCostos_Series_LoopMinimo.Value           = Common.Formatter.ToFixed(costoSeries.LoopMinimo);
                txtCostos_Series_Cancion.Value              = Common.Formatter.ToFixed(costoSeries.Cancion);
                txtCostos_Series_Coro.Value                 = Common.Formatter.ToFixed(costoSeries.Coro);
                txtCostos_Series_Palabras.Value             = Common.Formatter.ToFixed(costoSeries.Palabras);
                txtCostos_Series_Mezcla.Value               = Common.Formatter.ToFixed(costoSeries.Mezcla);
                txtCostos_Series_Direccion.Value            = Common.Formatter.ToFixed(costoSeries.Direccion);
                txtCostos_Series_Traduccion.Value           = Common.Formatter.ToFixed(costoSeries.Traduccion);
                txtCostos_Series_Adaptacion.Value           = Common.Formatter.ToFixed(costoSeries.Adaptacion);
                txtCostos_Series_Temporizacion.Value           = Common.Formatter.ToFixed(costoSeries.Temporizacion);
            }
            if ( costoVideojuegos.IsNotNull() )
            {
                txtCostos_Videojuegos_Palabras.Value        = Common.Formatter.ToFixed(costoVideojuegos.Loops);
                txtCostos_Videojuegos_Participacion.Value   = Common.Formatter.ToFixed(costoVideojuegos.LoopMinimo);
                txtCostos_Videojuegos_Cancion.Value         = Common.Formatter.ToFixed(costoVideojuegos.Cancion);
                txtCostos_Videojuegos_Coro.Value            = Common.Formatter.ToFixed(costoVideojuegos.Coro);
                txtCostos_Videojuegos_Rimas.Value           = Common.Formatter.ToFixed(costoVideojuegos.Palabras);
                txtCostos_Videojuegos_Traduccion.Value      = Common.Formatter.ToFixed(costoVideojuegos.Traduccion);
            }
            #endregion

            #region Parámetros - Importación
            var parametrosImportacion = new ControladorBase<ParametroImportacion>().ObtenerEntidad();
            if (parametrosImportacion.IsNotNull())
            {
                this.chkImportacion_Loops_Habilitado_Palabras.Checked = parametrosImportacion.HabilitadoLoopsPorPalabras;
                this.chkImportacion_Loops_Habilitado_Segundos.Checked = parametrosImportacion.HabilitadoLoopsPorSegundos;
                this.txtImportacion_Loops_Cantidad_Palabras.SetValue( parametrosImportacion.PalabrasPorLoop );
                this.txtImportacion_Loops_Cantidad_Segundos.SetValue( parametrosImportacion.SegundosPorLoop );

                this.txtImportacion_Ubicaciones_Habilitado_Traductor.Checked = parametrosImportacion.HabilitadoTraductor;
                this.txtImportacion_Ubicaciones_Habilitado_Proyecto.Checked = parametrosImportacion.HabilitadoProyecto;
                this.txtImportacion_Ubicaciones_Habilitado_Episodio.Checked = parametrosImportacion.HabilitadoEpisodio;
                this.txtImportacion_Ubicaciones_Habilitado_Clave.Checked = parametrosImportacion.HabilitadoClave;
                this.txtImportacion_Ubicaciones_Habilitado_TituloOriginal.Checked = parametrosImportacion.HabilitadoTituloOriginal;
                this.txtImportacion_Ubicaciones_Habilitado_TituloTraducido.Checked = parametrosImportacion.HabilitadoTituloTraducido;
                this.txtImportacion_Ubicaciones_Habilitado_Duracion.Checked = parametrosImportacion.HabilitadoDuracion;

                this.txtImportacion_Ubicaciones_Tabla_Traductor.SetValue( parametrosImportacion.TablaTraductor );
                this.txtImportacion_Ubicaciones_Tabla_Proyecto.SetValue( parametrosImportacion.TablaProyecto );
                this.txtImportacion_Ubicaciones_Tabla_Episodio.SetValue( parametrosImportacion.TablaEpisodio );
                this.txtImportacion_Ubicaciones_Tabla_Clave.SetValue( parametrosImportacion.TablaClave );
                this.txtImportacion_Ubicaciones_Tabla_TituloOriginal.SetValue( parametrosImportacion.TablaTituloOriginal );
                this.txtImportacion_Ubicaciones_Tabla_TituloTraducido.SetValue( parametrosImportacion.TablaTituloTraducido );
                this.txtImportacion_Ubicaciones_Tabla_Duracion.SetValue( parametrosImportacion.TablaDuracion );

                this.txtImportacion_Ubicaciones_Fila_Traductor.SetValue( parametrosImportacion.FilaTraductor );
                this.txtImportacion_Ubicaciones_Fila_Proyecto.SetValue( parametrosImportacion.FilaProyecto );
                this.txtImportacion_Ubicaciones_Fila_Episodio.SetValue( parametrosImportacion.FilaEpisodio );
                this.txtImportacion_Ubicaciones_Fila_Clave.SetValue( parametrosImportacion.FilaClave );
                this.txtImportacion_Ubicaciones_Fila_TituloTraducido.SetValue( parametrosImportacion.FilaTituloTraducido );
                this.txtImportacion_Ubicaciones_Fila_TituloOriginal.SetValue( parametrosImportacion.FilaTituloOriginal );
                this.txtImportacion_Ubicaciones_Fila_Duracion.SetValue( parametrosImportacion.FilaDuracion );

                this.txtImportacion_Ubicaciones_Col_Traductor.SetValue( parametrosImportacion.ColumnaTraductor );
                this.txtImportacion_Ubicaciones_Col_Clave.SetValue( parametrosImportacion.ColumnaTraductor );
                this.txtImportacion_Ubicaciones_Col_Proyecto.SetValue( parametrosImportacion.ColumnaProyecto );
                this.txtImportacion_Ubicaciones_Col_Episodio.SetValue( parametrosImportacion.ColumnaEpisodio );
                this.txtImportacion_Ubicaciones_Col_Clave.SetValue( parametrosImportacion.ColumnaClave );
                this.txtImportacion_Ubicaciones_Col_TituloTraducido.SetValue( parametrosImportacion.ColumnaTituloOriginal );
                this.txtImportacion_Ubicaciones_Col_TituloOriginal.SetValue( parametrosImportacion.ColumnaTituloTraducido );
                this.txtImportacion_Ubicaciones_Col_Duracion.SetValue( parametrosImportacion.ColumnaDuracion );
                
                this.chkImportacion_Validaciones_TimeCodeFaltante.Checked = parametrosImportacion.ValidacionTimeCodeFaltante;
                this.chkImportacion_Validaciones_TimeCodeFormatoIncorrecto.Checked = parametrosImportacion.ValidacionTimeCodeFormatoIncorrecto;
                this.chkImportacion_Validaciones_TimeCodeSecuenciaIncorrecta.Checked = parametrosImportacion.ValidacionTimeCodeSecuenciaIncorrecta;
                this.chkImportacion_Validaciones_FilaVacia.Checked = parametrosImportacion.ValidacionFilaVacia;

                this.chkImportacion_Anotaciones_Actor.Checked = parametrosImportacion.HabilitadoAnotacionActor;                
                this.selImportacion_Anotaciones_Actor.SetSelected(parametrosImportacion.AnotacionActor);
                this.chkImportacion_Anotaciones_Director.Checked = parametrosImportacion.HabilitadoAnotacionDirector;
                this.selImportacion_Anotaciones_Director.SetSelected(parametrosImportacion.AnotacionDirector);
                this.chkImportacion_Anotaciones_TimeCodeResetHora.Checked = parametrosImportacion.HabilitadoAnotacionTimeCodeResetHora;
                this.txtImportacion_Anotaciones_TimeCodeResetHora.SetValue( parametrosImportacion.AnotacionTimeCodeResetHora );
            }

            #endregion
        }

        #endregion

        #region Web Methods

        /// <summary>
        /// Actualiza los valores de los Parámetros del Sistema y los Costos
        /// </summary>
        /// <param name="infoParametros"></param>
        /// <param name="infoCostos"></param>
        /// <param name="infoParametrosImportacion"></param>
        /// <returns></returns>
        [WebMethod]
        public static string actualizarParametrosYCostos(string infoParametros, string infoCostos, string infoParametrosImportacion)
        {
            var mensaje     = "Hubo un error al intentar guardar los Parámetros.";
            var resultado   = false;
            object valor    = null;
            try
            {
                var parametroInfo                   = JsonConvert.DeserializeObject<ParametroInfo>(infoParametros);
                var costosInfo                      = JsonConvert.DeserializeObject<CostoInfo[]>(infoCostos);
                var costosInfo_Serie                = costosInfo.First(x => x.IdTipoProyecto == WellKnownKeys.Entities.TiposProyecto.SERIE.Id);
                var costosInfo_Videojuegos          = costosInfo.First(x => x.IdTipoProyecto == WellKnownKeys.Entities.TiposProyecto.VIDEOJUEGO.Id);

                #region Costos
                var cc                              = new ControladorBase<Costo>();
                var costoSerie                      = cc.ObtenerEntidad(x => x.TipoProyecto.Id == WellKnownKeys.Entities.TiposProyecto.SERIE.Id);
                var costoVideojuego                 = cc.ObtenerEntidad(x => x.TipoProyecto.Id == WellKnownKeys.Entities.TiposProyecto.VIDEOJUEGO.Id);
                if (costoSerie.IsNotNull())
                {
                    #region Serie
                    costoSerie.Loops                = costosInfo_Serie.Loops;
                    costoSerie.LoopMinimo           = costosInfo_Serie.LoopMinimo;
                    costoSerie.Cancion              = costosInfo_Serie.Cancion;
                    costoSerie.Coro                 = costosInfo_Serie.Coro;
                    costoSerie.Palabras             = costosInfo_Serie.Palabras;
                    costoSerie.Direccion            = costosInfo_Serie.Direccion;
                    costoSerie.Adaptacion           = costosInfo_Serie.Adaptacion;
                    costoSerie.Traduccion           = costosInfo_Serie.Traduccion;
                    costoSerie.Mezcla               = costosInfo_Serie.Mezcla;
                    costoSerie.Temporizacion        = costosInfo_Serie.Temporizacion;

                    cc.GuardarEntidad(costoSerie);
                    #endregion
                }
                if (costoVideojuego.IsNotNull())
                {
                    #region Videojuego
                    costoVideojuego.Loops           = costosInfo_Videojuegos.Loops;
                    costoVideojuego.LoopMinimo      = costosInfo_Videojuegos.LoopMinimo;
                    costoVideojuego.Cancion         = costosInfo_Videojuegos.Cancion;
                    costoVideojuego.Coro            = costosInfo_Videojuegos.Coro;
                    costoVideojuego.Palabras        = costosInfo_Videojuegos.Palabras;
                    costoVideojuego.Traduccion      = costosInfo_Videojuegos.Traduccion;

                    cc.GuardarEntidad(costoVideojuego);
                    #endregion
                }
                #endregion

                var parametroImportacionInfo = JsonConvert.DeserializeObject<ParametroImportacion>(infoParametrosImportacion);
                
                var pic = new ControladorBase<ParametroImportacion>();
                var importacion = pic.ObtenerEntidad();
                if (importacion.IsNotNull())
                {
                    importacion.HabilitadoClave = parametroImportacionInfo.HabilitadoClave;
                    importacion.HabilitadoDuracion = parametroImportacionInfo.HabilitadoDuracion;
                    importacion.HabilitadoEpisodio = parametroImportacionInfo.HabilitadoEpisodio;
                    importacion.HabilitadoProyecto = parametroImportacionInfo.HabilitadoProyecto;
                    importacion.HabilitadoTituloOriginal = parametroImportacionInfo.HabilitadoTituloOriginal;
                    importacion.HabilitadoTituloTraducido = parametroImportacionInfo.HabilitadoTituloTraducido;
                    importacion.HabilitadoTraductor = parametroImportacionInfo.HabilitadoTraductor;

                    importacion.TablaClave = parametroImportacionInfo.TablaClave;
                    importacion.TablaDuracion = parametroImportacionInfo.TablaDuracion;
                    importacion.TablaEpisodio = parametroImportacionInfo.TablaEpisodio;
                    importacion.TablaProyecto = parametroImportacionInfo.TablaProyecto;
                    importacion.TablaTituloOriginal = parametroImportacionInfo.TablaTituloOriginal;
                    importacion.TablaTituloTraducido = parametroImportacionInfo.TablaTituloTraducido;
                    importacion.TablaTraductor = parametroImportacionInfo.TablaTraductor;

                    importacion.FilaClave = parametroImportacionInfo.FilaClave;
                    importacion.FilaDuracion = parametroImportacionInfo.FilaDuracion;
                    importacion.FilaEpisodio = parametroImportacionInfo.FilaEpisodio;
                    importacion.FilaProyecto = parametroImportacionInfo.FilaProyecto;
                    importacion.FilaTituloOriginal = parametroImportacionInfo.FilaTituloOriginal;
                    importacion.FilaTituloTraducido = parametroImportacionInfo.FilaTituloTraducido;
                    importacion.FilaTraductor = parametroImportacionInfo.FilaTraductor;

                    importacion.ColumnaClave = parametroImportacionInfo.ColumnaClave;
                    importacion.ColumnaDuracion = parametroImportacionInfo.ColumnaDuracion;
                    importacion.ColumnaEpisodio = parametroImportacionInfo.ColumnaEpisodio;
                    importacion.ColumnaProyecto = parametroImportacionInfo.ColumnaProyecto;
                    importacion.ColumnaTituloOriginal = parametroImportacionInfo.ColumnaTituloOriginal;
                    importacion.ColumnaTituloTraducido = parametroImportacionInfo.ColumnaTituloTraducido;
                    importacion.ColumnaTraductor = parametroImportacionInfo.ColumnaTraductor;

                    importacion.ValidacionTimeCodeFaltante = parametroImportacionInfo.ValidacionTimeCodeFaltante;
                    importacion.ValidacionTimeCodeFormatoIncorrecto = parametroImportacionInfo.ValidacionTimeCodeFormatoIncorrecto;
                    importacion.ValidacionTimeCodeSecuenciaIncorrecta = parametroImportacionInfo.ValidacionTimeCodeSecuenciaIncorrecta;                    
                    importacion.ValidacionFilaVacia = parametroImportacionInfo.ValidacionFilaVacia;

                    importacion.HabilitadoLoopsPorPalabras = parametroImportacionInfo.HabilitadoLoopsPorPalabras;
                    importacion.HabilitadoLoopsPorSegundos = parametroImportacionInfo.HabilitadoLoopsPorSegundos;
                    importacion.PalabrasPorLoop = parametroImportacionInfo.PalabrasPorLoop;
                    importacion.SegundosPorLoop = parametroImportacionInfo.SegundosPorLoop;

                    importacion.HabilitadoAnotacionActor = parametroImportacionInfo.HabilitadoAnotacionActor;
                    importacion.AnotacionActor = parametroImportacionInfo.AnotacionActor;
                    importacion.HabilitadoAnotacionDirector = parametroImportacionInfo.HabilitadoAnotacionDirector;
                    importacion.AnotacionDirector = parametroImportacionInfo.AnotacionDirector;
                    importacion.HabilitadoAnotacionTimeCodeResetHora = parametroImportacionInfo.HabilitadoAnotacionTimeCodeResetHora;
                    importacion.AnotacionTimeCodeResetHora = parametroImportacionInfo.AnotacionTimeCodeResetHora;

                    pic.GuardarEntidad(importacion);
                }

                #region Parametros
                var uc = new ControladorBase<Parametro>();
                var parametro = uc.ObtenerEntidad();
                if (parametro.IsNotNull())
                {
                    #region Datos
                    parametro.CelularContacto       = parametroInfo.CelularContacto;
                    parametro.Contacto              = parametroInfo.Contacto;
                    parametro.DomicilioLegal        = parametroInfo.DomicilioLegal;
                    parametro.DomicilioReal         = parametroInfo.DomicilioReal;
                    parametro.EmailEmpresa          = parametroInfo.EmailEmpresa;
                    parametro.EmailContacto         = parametroInfo.EmailContacto;
                    parametro.Fax                   = parametroInfo.Fax;
                    parametro.IngresosBrutos        = parametroInfo.IngresosBrutos;
                    parametro.NroCuit               = parametroInfo.NroCuit;
                    parametro.RazonSocial           = parametroInfo.RazonSocial;
                    parametro.Responsable           = parametroInfo.Responsable;
                    parametro.Telefono              = parametroInfo.Telefono;
                    parametro.TelefonoContacto      = parametroInfo.TelefonoContacto;
                    #endregion

                    #region Email
                    parametro.EmailNombre           = parametroInfo.EmailNombre;
                    parametro.EmailNombreUsuario    = parametroInfo.EmailNombreUsuario;
                    parametro.EmailPassword         = parametroInfo.EmailPassword;
                    parametro.EmailSMTP             = parametroInfo.EmailSMTP;
                    parametro.EmailPuerto           = parametroInfo.EmailPuerto;
                    parametro.EmailHabilitarSSL     = parametroInfo.EmailHabilitarSSL;
                    parametro.EmailDirectores       = parametroInfo.EmailDirectores;
                    parametro.EmailProveedores      = parametroInfo.EmailProveedores;
                    parametro.EmailReclamos         = parametroInfo.EmailReclamos;
                    #endregion

                    resultado = uc.GuardarEntidad(parametro);
                    if ( resultado )
                    {
                        mensaje = "Los Parámetros fueron guardados exitosamente.";
                    }
                }
                #endregion
            }
            catch (Exception ex)
            {
                LogError(ex);
                mensaje = "Hubo un error al intentar guardar los Parámetros." + Environment.NewLine + ex.Message;
            }
            return SessionHelper.BuildResponse(mensaje, resultado, valor);
        }

        #endregion
    }
}